package net.xxcxcxcx.xc_enhancedmob.skills;

import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.damage.DamageSource;
import net.minecraft.entity.mob.MobEntity;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.text.Text;
import net.xxcxcxcx.xc_enhancedmob.config.skill.SkillConfig;
import net.xxcxcxcx.xc_enhancedmob.event.CustomEventTrigger;

import java.util.List;

public interface Skill extends CustomEventTrigger {
    //获取技能文本
    Text getText();

    //获取config文件
    SkillConfig getAConfig();

    //获取一个默认的config文件
    SkillConfig getDefaultConfig();

    //获取对应的ConfigMessage
    String getConfigMessage(SkillConfig skillConfig);

    String getName();

    //获取对应nbt
    NbtCompound getNbtCompound();

    //通过nbt新建
    void readbyNbtCompound(NbtCompound nbt);


    //获取技能稀有度
    SkillRarity getSkillRarity();

    //技能生效顺序越靠后的数字越大
    default int getEffectiveSequence() {
        return 0;
    }

    //获取技能等级
    default int getSkillLevel() {
        return 0;
    }

    //设置技能等级
    default void setSkillLevel(int i) {
    }

    //获取技能使用时间
    default long getSkilltime() {
        return 0;
    }

    //设置技能使用时间
    default void setSkilltime(long i) {
    }

    //获取技能使用次数
    default int getSkillUsecount() {
        return 0;
    }

    //设置技能使用次数
    default void setSkillUsecount(int i) {
    }

    //获取技能内置使用次数
    default int getSkillInsideUsecount() {
        return 0;
    }

    //设置技能内置使用次数
    default void setSkillInsideUsecount(int i) {
    }

    //获取技能最大等级
    default Integer getSkillMaxLevel() {
        return 0;
    }

    //设置技能最大等级
    default void setSkillMaxLevel(int i) {
    }

    //获取技能升级花费
    default int getSkillLevelCost() {
        return 0;
    }

    //获取技能准备时间
    default Integer getPreparationTime() {
        return 0;
    }

    //设置技能准备时间
    default void setPreparationTime(int i) {
    }

    //获取技能是否准备
    default boolean getwhetherPreparationTime() {
        return false;
    }

    //设置技能是否准备
    default void setwhetherPreparationTime(boolean i) {
    }

    //获取技能冷却时间
    default Integer getCooldown() {
        return 0;
    }

    //设置技能冷却时间
    default void setCooldown(int i) {
    }

    //获取技能内部冷却时间
    default Integer getInsideCooldown() {
        return 0;
    }

    //设置技能内部冷却时间
    default void setInsideCooldown(int i) {
    }

    //获取技能最大使用次数
    default Integer getMaxUseCount() {
        return 0;
    }

    //设置技能最大使用次数
    default void setMaxUseCount(int i) {
    }

    //获取技能内部最大使用次数
    default Integer getInsideMaxUseCount() {
        return 0;
    }

    //设置技能内部最大使用次数
    default void setInsideMaxUseCount(int i) {
    }

    //获取技能每级消耗
    List<Integer> getLevelCost();

    //设置技能每级消耗
    void setLevelCost(List<Integer> levelCost);

    //获取冲突技能列表
    List<String> getConflict();

    //设置冲突技能列表
    void setConflict(List<String> conflict);

    //技能是否可以使用
    default boolean canUseAbility(MobEntity mobEntity) {
        return false;
    }

    //属性技能
    default boolean onAttribute(MobEntity mobEntity) {
        return true;
    }

    //主动技能
    default boolean onAbilityUse(MobEntity mobEntity) {
        return true;
    }

    //被动技能
    default boolean passiveApply(MobEntity mobEntity) {
        return true;
    }

    //治疗时候触发技能,警告不要在治疗里面调用mobEntity.heal()
    default boolean onTreat(MobEntity mobEntity, Ref<Float> amount) {
        return true;
    }

    //开始攻击时候的技能
    default boolean onStartAttack(MobEntity attacker, LivingEntity entity) {
        return true;
    }

    //防御技能
    default boolean onDamaged(LivingEntity attacker, MobEntity target, DamageSource source, Ref<Float> amount, boolean ismob, boolean remote) {
        return true;
    }

    //攻击技能
    default boolean onAttack(MobEntity attacker, LivingEntity target, DamageSource source, Ref<Float> amount, boolean ismob, boolean remote) {
        return true;
    }

    //对自己的死亡技能
    default boolean onDeath(LivingEntity attacker, MobEntity target, DamageSource source, boolean ismob, boolean remote) {
        return true;
    }
}
